home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Ham Radio 2000
/
Ham Radio 2000.iso
/
ham2000
/
packet
/
aprs75c
/
sigplot.bas
< prev
next >
Wrap
BASIC Source File
|
1996-03-04
|
7KB
|
217 lines
DECLARE SUB InitScrn ()
DECLARE SUB DoPoint (N!, SIG!, PRN$, EL$)
DECLARE SUB PlotAvg (a$, N!)
DECLARE SUB Gfield (a!, a$, B$)
COMMON SHARED MX(), NO(), MI(), SS(), MA()
DIM MX(2, 40)
DIM NO(2, 99), MI(2, 99), SS(2, 99), MA(2, 99)
CLS : PRINT "SIGPLOT.bas Version 1.1 by Bob Bruninga, WB4APR"
PRINT
PRINT "This APRS program monitors the GPS NMEA data for the GPGSV sentence to extract"
PRINT "Azimuth, Elevation and Signal strength from satellites in view. It can"
PRINT "monitor TWO GPS units simultaneously so you can compare antennas. SIGPLOT"
PRINT "displays the present Signal and maximum value for each satellite as well as"
PRINT "plotting the Elevation pattern."
PRINT
PRINT "Each second's data is plotted as it comes in, but you may press either D or"
PRINT "L to force a new screen and plot of only the AVERAGE value, minimum, and"
PRINT "maximum value. The D only shows the DOTS, but the L connects the dots"
PRINT "with a LINE so that the elevation plot is easier to discern."
PRINT
PRINT "After about an hour of satellite movements, a signal value has been seen from"
PRINT "most angles giving a smooth elevation plot. Azimuths are currently ignored."
PRINT
PRINT "REMEMBER THESE Three QUESTIONABLE ASSUMPTIONS:"
PRINT " 1) All satellites are transmitting equal output powers"
PRINT " 2) Your AZIMUTH antenna pattern is OMNIdirectional"
PRINT " 3) Your sky view is unobstructed in all directions."
PRINT "This means that a satellite at 45 degrees to the east will be averaged with a"
PRINT "all other satellites at 45 degrees at all other azimuths, etc."
PRINT
INPUT "Enter the COM# port for the 1st GPS unit (COM1 or COM2), [COM1]"; a$
IF a$ = "" THEN Port$ = "COM1" ELSE Port$ = a$
OPEN Port$ + ":4800,n,8,1,cs0,cd0,ds0" FOR RANDOM AS #1
INPUT "Enter the COM# port for the 2nd GPS unit (COM1, COM2 or NONE), [NONE]"; a$
IF UCASE$(LEFT$(a$, 1)) = "C" THEN
OPEN a$ + ":4800,n,8,1,cs0,cd0,ds0" FOR RANDOM AS #2
Port2 = 2
END IF
ON ERROR GOTO errortrap
SCREEN 9
WIDTH 80, 43
CALL InitScrn
DO
GOSUB More1
LOCATE 5, 1: PRINT LEFT$("1: " + a$, 79)
IF LEFT$(a$, 6) = "$GPGGA" THEN
LOCATE 43, 1: PRINT LEFT$(a$, 79);
ELSEIF LEFT$(a$, 6) = "$GPGSV" THEN
a = 7
CALL Gfield(a, a$, NSS$)
CALL Gfield(a, a$, NCS$): LOCATE 1 + VAL(NCS$), 1: PRINT LEFT$(a$, 79)
CALL Gfield(a, a$, NSA$)
L = LEN(a$) - 4
DO WHILE a > 2 AND a < L
CALL Gfield(a, a$, PRN$)
LOCATE 9 + VAL(PRN$), 1: PRINT PRN$;
CALL Gfield(a, a$, EL$): PRINT RIGHT$(" " + EL$, 4);
CALL Gfield(a, a$, AZ$): PRINT RIGHT$(" " + AZ$, 4);
CALL Gfield(a, a$, SNR$)
SIG = VAL(SNR$)
IF SIG > 20 AND SIG < 60 THEN CALL DoPoint(1, SIG, PRN$, EL$)
LOOP
END IF
REM Now PORT TWO! * * * * * * * * * * * * * * * ** * * **** **
IF Port2 THEN
GOSUB More2
IF a2$ = "NoComms" THEN Port2 = 0
LOCATE 6, 1: PRINT LEFT$("2: " + a2$, 79)
IF LEFT$(a2$, 6) = "$GPGGA" THEN
ELSEIF LEFT$(a2$, 6) = "$GPGSV" THEN
a = 7
CALL Gfield(a, a2$, NSS$)
CALL Gfield(a, a2$, NCS$)
CALL Gfield(a, a2$, NSA$)
L = LEN(a2$) - 4
DO WHILE a > 2 AND a < L
CALL Gfield(a, a2$, PRN$)
LOCATE 9 + VAL(PRN$), 20
CALL Gfield(a, a2$, EL$)
CALL Gfield(a, a2$, AZ$)
CALL Gfield(a, a2$, SNR$)
SIG = VAL(SNR$)
IF SIG > 20 AND SIG < 60 THEN CALL DoPoint(2, SIG, PRN$, EL$)
LOOP
END IF
END IF
a$ = UCASE$(INKEY$)
IF a$ = "D" OR a$ = "L" THEN
CALL InitScrn
CALL PlotAvg(a$, 1)
CALL PlotAvg(a$, 2)
ELSEIF a$ = "R" THEN Port2 = 2: a2$ = ""
END IF
IF a$ = "Q" THEN END
LOOP
STOP
More1: t = 1: j = 1: a = 0: Strt = TIMER
DO WHILE j > 0 AND a = 0
IF ABS(TIMER - Strt) >= t THEN j = 0: a$ = "NoComms": As$ = "": EXIT DO
a = INSTR(As$, CHR$(13))
IF a > 0 THEN a$ = LEFT$(As$, a - 1): As$ = MID$(As$, a + 1): EXIT DO
IF LOC(1) > 0 THEN As$ = As$ + INPUT$(LOC(1), 1)
LOOP
DO WHILE LEFT$(a$, 1) < " " AND LEN(a$) > 0
a$ = MID$(a$, 2)
LOOP
RETURN
More2: t = 1: j = 1: a = 0: Strt = TIMER
DO WHILE j > 0 AND a = 0
IF ABS(TIMER - Strt) >= t THEN j = 0: a2$ = "NoComms": As2$ = "": EXIT DO
a = INSTR(As2$, CHR$(13))
IF a > 0 THEN a2$ = LEFT$(As2$, a - 1): As2$ = MID$(As2$, a + 1): EXIT DO
IF LOC(2) > 0 THEN As2$ = As2$ + INPUT$(LOC(2), 2)
LOOP
DO WHILE LEFT$(a2$, 1) < " " AND LEN(a2$) > 0
a2$ = MID$(a2$, 2)
LOOP
RETURN
errortrap: RESUME NEXT
SUB DoPoint (N, SIG, PRN$, EL$)
ELd = VAL(EL$)
SAT = VAL(PRN$): IF MX(N, SAT) < SIG THEN MX(N, SAT) = SIG
ELr = ELd / 57.4
SS(N, ELd) = SS(N, ELd) + SIG
NO(N, ELd) = NO(N, ELd) + 1
IF MI(N, ELd) = 0 THEN MI(N, ELd) = SIG
IF SIG > MA(N, ELd) THEN MA(N, ELd) = SIG
IF SIG < MI(N, ELd) THEN MI(N, ELd) = SIG
COE = 7 * COS(ELr)
SIE = 5 * SIN(ELr)
PRINT " "; SIG;
PRINT RIGHT$(" " + STR$(MX(N, SAT)), 3)
C = 14: IF N = 2 THEN C = 12
x = 200: y = 300: IF N = 2 THEN x = 198: y = 302
CIRCLE (x + SIG * COE, y - SIG * SIE), 1, C
END SUB
SUB Gfield (a, a$, B$)
B = INSTR(a + 1, a$, ",")
IF B >= a + 1 THEN B$ = MID$(a$, a + 1, B - (a + 1)) ELSE B = 1: B$ = ""
a = B
END SUB
SUB InitScrn
CLS
LOCATE 8, 1: PRINT "SAT EL AZ SIG MAX SG2 MX2"
LOCATE 9, 1: PRINT "--- -- -- --- --- --- ---"
LINE (240, 300)-(594, 48), 14, B
REM x*7 and y*5 is a square plot
FOR i = 0 TO 90
a = i / 57.4
PSET (240 + 350 * COS(a), 300 - 250 * SIN(a)), 15
PSET (240 + 280 * COS(a), 300 - 200 * SIN(a)), 15
PSET (240 + 210 * COS(a), 300 - 150 * SIN(a)), 15
IF INT(i / 10) = i / 10 THEN
CIRCLE (240 + 350 * COS(a), 300 - 250 * SIN(a)), 1, 15
CIRCLE (240 + 280 * COS(a), 300 - 200 * SIN(a)), 1, 15
CIRCLE (240 + 210 * COS(a), 300 - 150 * SIN(a)), 1, 15
END IF
NEXT
LOCATE 39, 32: PRINT "SIGNAL STRENGTH 30 40 50"
LOCATE 27, 32: PRINT "APRS SIGPLOT v1.1"
LOCATE 29, 32: PRINT "D - shows min, avg"
LOCATE 30, 32: PRINT " & max value DOTS"
LOCATE 32, 32: PRINT "L - shows a LINE plot"
LOCATE 34, 32: PRINT "R - will RETRY comms"
LOCATE 36, 32: PRINT "Q - to QUIT."
LOCATE 8, 55: PRINT "Let program run for"
LOCATE 9, 55: PRINT "At least an hour to"
LOCATE 10, 55: PRINT "fill in all angles."
LOCATE 12, 65: PRINT "de WB4APR"
END SUB
SUB PlotAvg (a$, N)
First = -1
FOR i = 1 TO 90
a = i / 57.4
COE = 7 * COS(a)
SIE = 5 * SIN(a)
SA = 0: IF NO(N, i) > 0 THEN SA = SS(N, i) / NO(N, i)
IF SA > 20 AND SA < 60 THEN
x = 200: y = 300: C = 10
IF N = 2 THEN x = 198: y = 302: C = 12
IF a$ = "L" THEN
IF First THEN
X0 = x + SA * COE: Y0 = y - SA * SIE
First = 0
ELSE X1 = x + SA * COE: Y1 = y - SA * SIE
LINE (X0, Y0)-(X1, Y1), C
X0 = X1: Y0 = Y1
END IF
ELSE
CIRCLE (x + SA * COE, y - SA * SIE), 3, C
END IF
CIRCLE (x + MI(N, i) * COE, y - MI(N, i) * SIE), 1, C
CIRCLE (x + MA(N, i) * COE, y - MA(N, i) * SIE), 1, C
END IF
NEXT i
END SUB